# 项目结构：
# 假设我们有一个项目目录结构如下：
# my_project/
# │
# ├── main.py
# ├── math_operations/
# │   ├── __init__.py
# │   ├── basic.py
# │   └── advanced.py
# └── utils/
#     ├── __init__.py
#     └── helper.py

# 创建模块与包
# 首先，我们创建一些 Python 文件来组成模块和包。
# math_operations/basic.py：
# 基础运算模块
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

# math_operations/advanced.py：
# 高级运算模块
def multiply(a, b):
    return a * b

def divide(a, b):
    if b == 0:
        raise ValueError("除数不能为零")
    return a / b
# utils/helper.py：
# 辅助工具模块
def print_welcome_message(name):
    print(f"欢迎，{name}!")

# 在 main.py 中导入模块
# 在 main.py 文件中，我们将导入并使用这些模块和包。
# 导入math_operations包中的基本运算模块和高级运算模块
from math_operations.basic import add, subtract
from math_operations.advanced import multiply, divide
import utils.helper as helper  # 使用别名导入模块

def main():
    # 使用basic模块中的运算
    result_add = add(10, 5)
    result_subtract = subtract(10, 5)

    # 使用advanced模块中的运算
    result_multiply = multiply(10, 5)
    try:
        result_divide = divide(10, 0)
    except ValueError as e:
        result_divide = f"错误: {e}"

    # 使用helper模块中的工具
    helper.print_welcome_message("Alice")

    # 输出结果
    print(f"加法结果: {result_add}")
    print(f"减法结果: {result_subtract}")
    print(f"乘法结果: {result_multiply}")
    print(f"除法结果: {result_divide}")

if __name__ == "__main__":
    main()

# 包的概念
# ● math_operations/ 和 utils/ 目录本身是包。我们通过包含 __init__.py 文件（即使是空的）来告诉 Python 这些目录是包。
# ● 包中的模块可以通过 from 包名.模块名 import 函数/类 的方式导入。

使用模块的别名
# ● 在 main.py 中，我们通过 import utils.helper as helper 给 helper 模块指定了一个别名。
# 这样我们在调用 helper.print_welcome_message 时，可以使用更短的名称。

# 模块的相对导入（在包内使用）
# 如果我们在 math_operations/ 包内的某个模块中需要导入另一个模块，可以使用相对导入。比如，假设我们在 advanced.py 中需要导入 basic.py 中的函数，我们可以这样做：
#
# 修改后的 math_operations/advanced.py：
# 高级运算模块
from .basic import add, subtract  # 相对导入basic模块中的函数

def multiply(a, b):
    return a * b

def divide(a, b):
    if b == 0:
        raise ValueError("除数不能为零")
    return a / b

def add_and_multiply(a, b):
    # 调用basic模块中的加法运算
    sum_result = add(a, b)
    return multiply(sum_result, b)  # 使用本模块的乘法运算

# 总结：
# ● 模块：Python 文件本身就是一个模块。通过 import 语句可以导入模块中的函数、类等。
# ● 包：包是包含多个模块的文件夹，必须包含一个 __init__.py 文件（即使是空的），它使得文件夹成为一个包，可以通过包名来导入其中的模块。
# ● 模块别名：使用 import ... as ... 可以为模块指定一个别名，便于调用。
# ● 相对导入：在包内的模块之间可以使用相对导入，例如使用 from .basic import ... 来导入同一包内的其他模块。